// Arrays (数组) 示例
// 演示 Pascal 中数组的各种用法

Program p_8_arrays;

{$mode objfpc}{$H+}
// {$mode objfpc} 启用 Object Pascal 模式
// {$H+} 启用长字符串支持（AnsiString）

// 引入单元文件

Uses 
SysUtils;
// 系统工具单元，包含常用的系统函数

// 所有变量声明移到这里

Var 
  numbers: array[1..5] Of Integer;
  letters: array[0..4] Of Char;
  fruits: array[1..4] Of String;
  i, j, k: Integer;
  sum, max, value: Integer;
  matrix: array[1..3, 1..3] Of Integer;
  source: array[1..3] Of Integer;
  destination: array[1..3] Of Integer;

  // 程序主入口
Begin
  WriteLn('=== Pascal 数组示例 ===');
  WriteLn;

  // 1. 基本数组声明和初始化
  WriteLn('1. 基本数组声明和初始化:');
  numbers[1] := 10;
  numbers[2] := 20;
  numbers[3] := 30;
  numbers[4] := 40;
  numbers[5] := 50;
  
  For i := 1 To 5 Do
    WriteLn('  numbers[', i, '] = ', numbers[i]);
  
  WriteLn;
  
  // 2. 字符数组
  WriteLn('2. 字符数组:');
  letters[0] := 'A';
  letters[1] := 'B';
  letters[2] := 'C';
  letters[3] := 'D';
  letters[4] := 'E';
  
  For j := 0 To 4 Do
    WriteLn('  letters[', j, '] = ', letters[j]);
  
  WriteLn;

  // 3. 数组元素的修改
  WriteLn('3. 数组元素的修改:');
  WriteLn('  修改前 numbers[3] = ', numbers[3]);
  numbers[3] := 99;
  WriteLn('  修改后 numbers[3] = ', numbers[3]);

  WriteLn;

  // 4. 字符串数组
  WriteLn('4. 字符串数组:');
  fruits[1] := '苹果';
  fruits[2] := '香蕉';
  fruits[3] := '橙子';
  fruits[4] := '葡萄';
  
  For k := 1 To 4 Do
    WriteLn('  水果', k, ': ', fruits[k]);
  
  WriteLn;
  
  // 5. 数组求和
  WriteLn('5. 数组求和:');
  sum := 0;
  For i := 1 To 5 Do
    sum := sum + numbers[i];
  WriteLn('  numbers数组元素之和: ', sum);
  
  WriteLn;
  
  // 6. 查找数组中的最大值
  WriteLn('6. 查找数组中的最大值:');
  max := numbers[1];
  For i := 2 To 5 Do
  Begin
    If numbers[i] > max Then
      max := numbers[i];
  End;
  WriteLn('  numbers数组中的最大值: ', max);
  
  WriteLn;

  // 7. 多维数组
  WriteLn('7. 多维数组 (3x3矩阵):');
  // 初始化矩阵
  value := 1;
  For i := 1 To 3 Do
    Begin
      For j := 1 To 3 Do
        Begin
          matrix[i, j] := value;
          value := value + 1;
        End;
    End;

  // 输出矩阵
  For i := 1 To 3 Do
  Begin
    For j := 1 To 3 Do
      Write(matrix[i, j]:4);  // 格式化输出
    WriteLn;
  End;
  
  WriteLn;
  
  // 8. 数组复制
  WriteLn('8. 数组复制:');
  source[1] := 100;
  source[2] := 200;
  source[3] := 300;
  
  // 复制数组
  For i := 1 To 3 Do
    destination[i] := source[i];
  
  WriteLn('  源数组:');
  For i := 1 To 3 Do
    WriteLn('    source[', i, '] = ', source[i]);
    
  WriteLn('  目标数组:');
  For i := 1 To 3 Do
    WriteLn('    destination[', i, '] = ', destination[i]);
  
  WriteLn;
  WriteLn('演示了 Pascal 中数组的各种用法');

  // 等待用户按键，防止程序窗口立即关闭
  ReadLn;
End.
